package com.example.student_manager_backend.service;

import com.example.student_manager_backend.entity.Student;
import com.example.student_manager_backend.exception.BusinessException;
import com.example.student_manager_backend.repository.StudentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 学生服务类
 * 提供学生相关的业务逻辑处理
 */
@Service
public class StudentService {

    @Autowired
    private StudentRepository studentRepository;

    /**
     * 创建学生
     *
     * @param student 学生信息
     * @return 创建的学生
     */
    @Transactional
    public Student createStudent(Student student) {
        if (studentRepository.existsByStudentId(student.getStudentId())) {
            throw new BusinessException("学号已存在");
        }
        return studentRepository.save(student);
    }

    /**
     * 更新学生信息
     *
     * @param studentId 学号
     * @param student 学生信息
     * @return 更新后的学生
     */
    @Transactional
    @CacheEvict(value = "students", key = "#studentId")
    public Student updateStudent(String studentId, Student student) {
        Student existingStudent = studentRepository.findByStudentId(studentId);
        if (existingStudent == null) {
            throw new BusinessException("学生不存在");
        }
        student.setStudentId(studentId);
        return studentRepository.save(student);
    }

    /**
     * 删除学生
     *
     * @param studentId 学号
     */
    @Transactional
    @CacheEvict(value = "students", key = "#studentId")
    public void deleteStudent(String studentId) {
        if (!studentRepository.existsByStudentId(studentId)) {
            throw new BusinessException("学生不存在");
        }
        studentRepository.deleteById(studentId);
    }

    /**
     * 根据学号查询学生
     *
     * @param studentId 学号
     * @return 学生信息
     */
    @Cacheable(value = "students", key = "#studentId")
    public Student getStudent(String studentId) {
        Student student = studentRepository.findByStudentId(studentId);
        if (student == null) {
            throw new BusinessException("学生不存在");
        }
        return student;
    }


    /**
     * 分页查询学生列表
     *
     * @param spec 查询条件
     * @param pageable 分页参数
     * @return 学生分页列表
     */
    public Page<Student> findStudents(Specification<Student> spec, Pageable pageable) {
        return studentRepository.findAll(spec, pageable);
    }

    /**
     * 根据班级ID查询学生列表
     *
     * @param classId 班级ID
     * @return 学生列表
     */
    public List<Student> findStudentsByClass(String classId) {
        return studentRepository.findByClassId(classId);
    }

    /**
     * 根据姓名模糊查询学生列表
     *
     * @param name 学生姓名
     * @return 学生列表
     */
    public List<Student> findStudentsByName(String name) {
        return studentRepository.findByNameContaining(name);
    }

    /**
     * 从Excel导入学生数据
     *
     * @param file Excel文件
     * @return 导入的学生列表
     */
    @Transactional
    public List<Student> importStudents(MultipartFile file) {
        // TODO: 实现Excel导入逻辑
        return null;
    }

    /**
     * 导出学生数据到Excel
     *
     * @param students 学生列表
     * @return Excel文件的字节数组
     */
    public byte[] exportStudents(List<Student> students) {
        // TODO: 实现Excel导出逻辑
        return null;
    }
} 